Matematický   koprocesor   Intel   8087

je téměř samostatně pracující jednotkou pro matematické operace v pohyblivé řádové čárce. U procesorů 8086/8088, 80186/80188, 80286 a 80386 se jednalo o samostatnou jednotku, která však byla od 80486 integrována přímo do procesoru. Její programové ovládání však zůstalo stejné kvůli zachování zpětné kompatibility, takže principy zde popsané fungují i u těchto nových typů.


Obsah:


Typy dat používané v matematickém koprocesoru

 Název  formátu   Označení  v Pascalu   Počet  slabik   Přibližný  rozsah   Grafické znázornění 
 Slovo integer  Integer  2  -32 768 až 32 767
 
 Krátký integer  Longint  4  -2 * 10 9 až 2 * 10 9
 
 Dlouhý integer  Comp  8  -9.2 * 10 18 až 9.2 * 10 18
 
 BCD zhuštěný 
 10  -10 18+1 až 10 18-1
  
 Krátký real  Single  4  ±10 -38 až ±3 * 10 38
 
 Dlouhý real  Double  8  ±10 -308 až ±10 308
 
 Pomocný real  Extended  10  ±10 -4932 až ±10 4932
 

Koprocesor interně ukládá a zpracovává pouze 80bitová reálná čísla. Ostatní tvary jsou použity jen na vstupu a výstupu z koprocesoru a ten je interně převádí do a z 80bitových reálných čísel.
Objekt, ve kterém je uloženo reálné číslo, je rozdělen na tři části. Nejvyšší bit, na obrázku označený písmenem S, je znaménkový bit. Je-li nulový, je číslo uložené v objektu kladné. Část označená Exponent nese informaci o velikosti čísla a Mantisa uchovává číslice čísla.
Do mantisy jsou ukládány významné binární číslice. Neukládají se nevýznamné levostranné nuly. Aby se šířka mantisy využila co nejvíce, ukládá se v normalizovaném tvaru, tj. první významná číslice je umístěna v nejvyšším bitu. Z takto definovaného pravidla vyplývá, že v nejvyšším bitu musí být vždy jednička vyjma případu, kdy je v objektu uloženo číslo nula. Vezmeme-li nulu jako speciální případ, může být přesnost rozšířena o jeden bit tak, že binární jedničku nejvyššího řádu do objektu neukládáme.
Mantisa 16bitových a 32bitových reálných čísel tedy obsahuje v nejvyšším bitu druhou významnou binární číslici. V 80bitovém reálném číslu není nejvyšší významná číslice ignorována.
Mantisa vyjadřuje binární číslo ve tvaru 1.xxxxxxx. Exponent potom určuje počet binárních řádků, o které musíme destinou tečku pomyslně posunout, abychom získali požadované číslo. Posouváme-li tečku doleva, bude exponent záporný, posováme-li doprava, bude exponent kladný. Zjednodušeně lze číslo vyjádřit matematicky: Mantisa × 2 Exponent
Exponent je celé číslo kladné nebo záporné. Není vyjádřen ve dvojkovém doplňkovém kódu, jak by se dalo předpokládat, ale v kódu posunuté nuly. Je-li prostor pro uložení exponentu 8bitový (Single Precision), je k zapisovanému číslu přičtena hodnota 7Fh (127). Potom nula bude zapsána jako 7Fh, jednička jako 80h atd. Je-li prostor pro uložení exponentu 11bitový (Double Precision), přičítá se 3FFh (1023), a je-li exponent 15bitový, přičítá se 3FFFh (16383). Při čtení čísla tohoto tvaru musíme výše uvedenou hodnotu odečíst.
Ačkoli se tento způsob ukládání čísel zdá být nevhodný, přináší jeden významný efekt, který spočívá ve snadném znaménkovém porovnávání dvou reálných čísel bez ohledu na jejich šířku. Obě reálná čísla začneme srovnávat od znaménkového bitu směrem k nejnižšímu bitu objektu. Jakmile narazíme na dvojici neshodujících se bitů, sdělí nám tyto dva bity, které z čísel je numericky větší.

Příklady uložení reálných čísel v paměti:

Číslo    S     Exponent   Mantisa
 31   30 23     22 0  
12.5  0    1000 0010       1001 0000...0   
-12.5  1 1000 0010 1001 0000...0
0.3125  0 0111 1101 0100 0000...0
  -0.3125  1 0111 1101 0100 0000...0
1.0  0 0111 1111 0000 0000...0

Číslo    S     Exponent   Mantisa
 79   78 64     63 0  
12.5  0    100 0000 0000 0010       1100 1000...0   
 -0.3125  1 011 1111 1111 1101 1010 0000...0

 

Výhradní symboly

     Nula (Zero) může být kladná nebo záporná. Koprocesor běžně pracuje s kladnou nulou.

    Nekonečno (Infinity) může být opět kladné nebo záporné. Pokud bychom obě nekonečna srvonávali, je kladné nekonečno větší než záporné (viz také řídící registr).

Číslo    S     Exponent   Mantisa
 31   30 23     22 0  
Kladná nula  0    0000 0000       0000 0000...0   
Záporná nula  1    0000 0000       0000 0000...0   
Kladné nekonečno  0    1111 1111       0000 0000...0   
 Záporné nekonečno  1    1111 1111       0000 0000...0   

    Nenormalizované číslo (Denormalized number) se připouští pouze tehdy, potřebujeme-li zapsat menší číslo v absolutní hodnotě, než je exponent schopen zobrazit. Potom doplněním nevýznamných levostranných nul do mantisy můžeme číslo ještě (v absolutní hodnotě) zmenšit na úkor přesnosti. O číslu musí být známo, že je v nenormalizovaném tvaru, aby se nedoplňovala jednička do nejvyššího řádu mantisy.

    Nečíselné hodnoty (Not a Number) se uvádějí pod zkratkou NaN. Poněvadž nejsou povoleny všechny kombinace bitů, jsou nepovolené kombinace označeny NaN a koprocesor takové vstupní hodnoty odmítne. Nečíselné hodnory jsou rozděleny do dvou skupin: neohlašované (Quiet) a ohlašované (Signaling). Do neohlašovaných patří čísla s mantisou v rozmezí od 100...01 do 111...11. Do ohlašovaných patří 100...01 až 101...11. Obě skupiny mají exponent 111...11.

    Neurčitá hodnota (Indefinite) je určena pro každý typ čísla včetně celočíselných. Běžně je neurčitá hodnota představována největším záporným číslem v absolutní hodnotě. V reálných formátech je neurčitá hodnota tvořena exponentem obsahujícím samé jedničky a mantisou obsahující 110...00.

 

Výjimky koprocesoru

Detekuje-li koprocesor chybu při výpočtu, procesor na tento stav odpoví generováním výjimky 16. Koprocesor umí detekovat několik různých chyb. Konkrétní druh chyby se oznamuje ve stavovém registru koprocesoru. Možné chyby jsou následující:

I -
Invalid operation - Chybná operace je detekována rozpoznáním NaN, nepodporovaného formátu čísla, nepovolenou operací (např. 0 × nekonečno, 0/0, (kladné nekonečno) + (záporné nekonečno)) nebo přeplněním zásobníku (potom je také nastaveno SF). Je-li toto přerušení maskováno, vrací se jako výsledek neohlašované NaN, nedefinované celé číslo nebo nedefinované BCD.
D -
Denormalized - Nenormalizovaný výsledek je zapříčiněn hodnotou výsledku, která je v absolutní hodnotě menší než číslo zobrazitelné nejmenším záporným normalizovaným číslem. Je-li přerušení maskováno, výpočet pokračuje normálně dál.
Z -
Divide by zero - Dělení nulou nastane tehdy, je-li dělitel nula a dělenec je různý od nekonečna a nuly. Je-li přerušení maskováno, je výsledek nekonečno.
O -
Numeric overflow - Přeplnění (Přetečení) je detekováno tehdy, je-li výsledek větší než maximální zobrazitelné číslo v použitém formátu dat. Je-li přerušení maskováno, je výsledek největší možné konečné číslo nebo nekonečno.
U -
Numeric underflow - Nenaplnění (Podtečení) nastane při nenulovém výsledku operace, který je tak malý, že jej nelze v daném formátu dat zobrazit. Je-li přerušení maskováno, je výsledek nenormalizované číslo nebo nula.
P -
Precision - Nepřesný výsledek nastane tehdy, nebyl-li koprocesor schopen počítat výsledek v zadané přesnosti. Výsledek je zaokrouhlen podle řídícího registru. Je-li přerušení maskováno, výpočet pokračuje dál.

 

Registry koprocesoru

Datové registry (zásobník)
Koprocesor obsahuje 8 80bitových datových registrů. Tato skupina registrů může být použita buď jako zásobník, nebo jako jednotlivě adresované registry.
Používá-li se jako zásobník, potom je ve
stavovém registru v položce "Vrchol" číslo registru, který je právě na vrcholu zásobníku - tj. číslo registru do kterého byla operací vložení do zásobníku zapsána poslední hodnota.
Registr, který je právě na vrcholu zásobníku, je označován ST(0) nebo jen ST. Ukazuje-li "Vrchol" např. na registr číslo 2, potom ST(0) znázorňuje registr číslo 2, ST(1) registr číslo 3, ST(2) registr číslo 4, ST(5) registr číslo 7, ST(6) registr číslo 0, ST(7) registr číslo 1.
Osm datových registrů je skutečně implementováno jako zásobník, nikoli jako kruhová fronta. Proto je-li do zásobníku vloženo více než 8 operandů, generuje koprocesor přerušení chybná operace (ve stavovém registru je nsataveno SF - chyba zásobníku a C1 - přeplnění). Přerušení se generuje také v tom případě, pokud je ze zásobníku vybráno více než 8 položek.
Každý z registrů má navíc ještě dvoubitovou položku v tzv. doplňujícím registru, která obsahuje doplňující informace o registru. Jsou čtyři možné kombinace:
 00  správný obsah registru
 01  nula
 10  nekonečno, NaN, nenormalizováno nebo chybný formát
 11  prázdný
 

Stavba datových registrů a doplňujícího registru:

Řídící registr (CWR)
Nastavuje některé parametry pro výpočty v koprocesoru.

IC (Infinity Control) určuje výklad záporného a kladného nekonečna:
0 kladné i záporné nekonečno jsou chápány jako nekonečná veličina bez znaménka
1 kladné a záporné nekonečno jsou pojaty jako dvě různé veličiny se znaménkem
implicitně je IC nastaveno na 0
RC (Rounding Control) řídí zaokrouhlování výsledků. Možné kombinace jsou tyto:
00 zaokrouhlení na nejbližší číslo
01 zaokrouhlení dolů (směrem k zápornému nekonečnu)
10 zaokrouhlení nahoru (směrem ke kladnému nekonečnu)
11 oseknutí
implicitně je RC nastaveno na 00
PC (Precision Control) stanovuje přesnost výsledku. Přesnost může být snížena proto, aby byl zrychlen výpočet. Možné kombinace jsou tyto:
00 24 bitů (Single Precision)
01 nepoužito
10 53 bitů (Double Precision)
11 64 bitů (Extended Precision)
implicitně je PC nastaveno na 11
IEM (Interrupt Error Mask) jedničkové maskuje všechna přerušení (s výjimkou situace, kdy CPU vykonává instrukci WAIT)
PM (Precision Mask) jedničkové maskuje přerušení vyvolané nepřesným výsledkem
UM (Underflow Mask) jedničkové maskuje přerušení vyvolané podtečením
OM (Overflow Mask) jedničkové maskuje přerušení vyvolané přetečením
ZM (Divide-by-Zero Mask) jedničkové maskuje přerušení vyvolané dělením nulou
DM (Denormalized Mask) jedničkové maskuje přerušení vyvolané nenormalizovaným výsledkem
IM (Invalid Operation Mask) jedničkové maskuje přerušení vyvolané chybnou operací
 

Stavový registr

B (Busy) jedničkový oznamuje, že operace není dokončena. U vyšších procesorů neodráží aktuální stav koprocesoru a obsahuje totéž co bit ES.
C3, C2, C1, C0 (Condition Ci) jsou čtyři bity příznaků nastavovaných podle výsledku provedené operace.
Vrchol (Top) je 3bitová hodnota uchovávající číslo datového registru, který je právě na vrcholu zásobníku.
ES (Error Summary) je programovým duplikátem signálu FERR. Sděluje, že nastalo přerušení, které bylo vyvoláno jednou z nemaskovaných chybových příčin.
SF (Stack Fault) upřesňuje, že chybná operace byla vyvolána chybou v zásobníku. Pokud je tento bit nastaven, je C1=1 při přeplnění zásobníku nebo C1=0 při nenaplnění zásobníku.
PE, UE, OE, ZE, DE, IE Každý z těchto bitů oznamuje, že přerušení nastalo po výskytu příslušné chyby. Jednotlivé bity odpovídají bitům řídícího registru, které na rozdíl od stavového registru jednotlivá přerušení maskují.

 

Instrukční repertoár a komunikace koprocesoru s procesorem

Instrukce určené koprocesoru jsou v instrukčním toku společně s instrukcemi pro procesor. Jakmile procesor rozpozná, že instrukce je určena koprocesoru (prvních 5 bitů instrukce je 11011), předá ji na V/V bránu určenou pro předávání příkazů koprocesoru (8000 00F8h). Potom procesor normálně pokračuje ve zpracovávání instrukčního toku. Pokud FPU požaduje více informací (tj. další slabiku operačního kódu nebo slabiku operandu), nastaví signál PEREQ (Processor Extension Request) do aktivní úrovně (v Intel486 a vyšších není vyveden vně procesoru). Na základě toho si procesor přečte V/V bránu pro předávání příkazů koprocesoru, aby zjistil, co koprocesor potřebuje. Pokud koprocesor vyžaduje přenést data, předá je procesor prostřednictvím datové V/V brány (8000 00FCh).
Po dobu vykonávání instrukce je nastavena aktivní úroveň signálu BUSY (u 8086/8088 je to signál TEST) (v Intel486 a vyšších není opět vyveden vně procesoru), který informuje procesor o tom, že koprocesor není schopen přijímat další příkazy. V takovém případě procesor čeká na dokončení činnosti koprocesoru.
Pro každou mnemonickou instrukci koprocesoru, která ovlivňuje numerickou jednotku, generuje asembler dvě strojové instrukce: kód instrukce WAIT (9Bh) a kód příslušné varianty instrukce ESC.
Instrukce WAIT, zkoumající signál BUSY (TEST), se předřazuje, aby se koprocesoru umožnilo dokončit rozpracovanou operaci dříve, než dekóduje ESC.

K součinnosti procesoru a koprocesoru:


 Legenda k seznamu instrukcí:
 D a S - cílové a zdrojové místo (operand) definované symbolickou adresou
 (D) a (S) - obsah místa adresovaného D a S
 ST - ukazatel vrcholu zásobníku
 (ST) - obsah vrcholu zásobníku
 ST(i) - indexovaně adresovaný registr zásobníku
 msr mlr mtr  - operand typu krátký real nebo dlouhý real nebo pomocný real v paměti
 mwi msi mli - operand typu integer nebo krátký integer nebo dlouhý integer v paměti
 mBCD - operand typu zhuštěný BCD v paměti
 // a / - označení alternativních kombinací v operandovém poli instrukce

Instrukce Operace Operandy  Indikace chyb  Poznámky
P ř e s u n y   d a t
 FLD  S  ST := ST - 1
 převod S na pomocný  real
 Dosazení do (ST)
 ST(i), msr, mlr,  mtr  I, D  zavedení real
 FILD  S  ST := ST - 1
 převod S na pomocný  real
 Dosazení do (ST)
 mwi, msi, mli  I  zavedení integer
 FBLD  S  ST := ST - 1
 převod S na pomocný  real
 Dosazení do (ST)
 mBCD  I  zavedení BCD
 FST  D  převod (ST) do formátu  operandu
 uložení do D
 ST(i), msr, mlr  I, O, U, P  uložení real
 FIST  D  převod (ST) do formátu  operandu
 uložení do D
 mwi, msi  I, P  uložení integer
 FBSTP  D  převod (ST) do formátu  operandu
 uložení do D
 ST := ST + 1
 mBCD  I  uložení BCD + pop
 FSTP  D  převod (ST) do formátu  operandu
 uložení do D
 ST := ST + 1
 ST(i), msr, mlr,  mtr  I, O, U, P  uložení real + pop
 FISTP  D  převod (ST) do formátu  operandu
 uložení do D
 ST := ST + 1
 mwi, msi, mli  I, P  uložení integer + pop
 FXCH//D  výměna obsahů mezi  (ST) a D  ST(i) - není-li D
 uveden, platí  ST (1)
 I  výměna mezi (ST)
 DST
A r i t m e t i c k é   o p e r a c e
 FADD//S/D, S  (D) := (D) + (S)  viz poznámka 1  I, D, O, U, P  sčítání real
 FADDP D, S  (ST(i)) := (ST(i)) +  (ST)
  ST := ST + 1
 D: ST(i), S: ST  I, D, O, U, P  sčítání real + pop
 FIADD  S  (ST) := (ST) + (S)  mwi, msi  I, D, O, U, P  sčítání integer
 FSUB//S/D, S  (D) := (D) - (S)  viz poznámka 1  I, D, O, U, P  odčítání real
 FSUBP  D, S  (ST(i)) := (ST(i)) -  (ST)
  ST := ST + 1
 D: ST(i), S: ST  I, D, O, U, P  odčítání real + pop
 FSUBR//S/D, S  (D) := (S) - (ST(i))
  ST := ST + 1
 viz poznámka 1  I, D, O, U, P  reverzní odčítání real
 FSUBRP  D, S  (ST(i)) := (ST) -  (ST (i))
  ST := ST + 1
 D: ST(i), S: ST  I, D, O, U, P  reverzní odčítání real +  pop
 FISUB  S  (ST) := (ST) - (S)  mwi, msi  I, D, O, P  odčítání integer
 FISUBR  S  (ST) := (S) - (ST)  mwi, msi  I, D, O, P  reverzní odčítání integer
 FMUL//S/D, S  (D) := (D) * (S)  viz poznámka 1  I, D, O, U, P  násobení real
 FMULP  D, S  (ST(i)) := (ST(i)) *  (ST)
  ST := ST + 1
 D: ST(i), S: ST  I, D, O, U, P  násobení real + pop
 FIMUL  S  (ST) := (ST) * (S)  mwi, msi  I, D, O, P  násobení integer
 FDIV//S/D, S  (D) := (D) / (S)  viz poznámka 1  I, D, Z, O, U,  P  dělení real
 FDIVP  D, S  (ST(i)) := (ST(i)) /  (ST)
  ST := ST + 1
 D: ST(i), S: ST  I, D, Z, O, U,  P  dělení real + pop
 FDIVR//S/D, S  (D) := (S) / (D)  viz poznámka 1  I, D, Z, O, U,  P  reverzní dělení real
 FDIVRP  D, S  (ST(i)) := (ST) /  (ST (i))
  ST := ST + 1
 D: ST(i), S: ST  I, D, Z, O, U,  P  reverzní dělení real +  pop
 FIDIV  S  (ST) := (ST) / (S)  mwi, msi  I, D, Z, O, U,  P  dělení integer
 FIDIVR  S  (ST) := (S) / (ST)  mwi, msi  I  reverzní dělení integer
 FABS  (ST) := |(ST)|  -  I  absolutní hodnota
 FCHS  (ST) := -(ST)  -  I  změna znaménka
 FPREM  (ST) := (ST) mod  (ST (1))  -  I, D, U  parciální zbytek
 FRNDINT  (ST) := integer (ST)  -  I, P  zaokrouhlení integer
 - definováno polem RC
 FSCALE  (ST) := (ST) * 2(ST(1))  -  I, O, U  rychlé násobení 2n
 -2 15 <= n < 2 15
 FSQRT  (ST) := sqrt((ST))  -  I, D, P  odmocnina
 FXTRACT  (ST) := exponent (ST)
 (ST) := ST - 1
 (ST) := mantisa
 -  I  rozdělení exponentu a  mantisy
K O M P A R A C E
 FCOM//S  (ST) - (S); nastav  C3, C2, C0  podle  poznámky 2  ST(i), msi, mli
 není li S uveden, platí  ST(1)
 I, D  komparace real
 FCOMP//S  (ST) - (S); nastav  C3, C2, C0  podle  poznámky 2
 ST := ST + 1
 ST(i), msi, mli
 není li S uveden, platí  ST(1)
 I, D  komparace real + pop
 FCOMPP  (ST) - (ST(1));  nastav  C3, C2, C0  podle  poznámky 3  -  I, D  komparace real +  dvakrát pop
 FICOM  S  (ST) - (S), nastav  C3, C2, C0  podle  poznámky 2  mwi, msi  I, D  komparace integer
 FICOMP  S  (ST) - (S), nastav  C3, C2, C0  podle  poznámky 2
 ST := ST + 1
 mwi, msi  I, D  komparace integer +  pop
 FTST  (ST) - 0.0, nastav  C3, C2, C0  podle  poznámky 3  -  I, D  test vrcholu zásobníku
 znaménko nuly se ignoruje (-0,0 = +0,0)
 FXAM  nastav C3, C2, C1 a  C0  podle  poznámky 4  -  -  stav vrcholu zásobníku
T R A N S E N D E N T Y
 F2XM1  (ST) := 2(ST) - 1  -  U, P  při 0 <= (ST) <= 0.5
 FPATAN  (ST) := arctg[(ST(1)  / (ST)]
 (ST) := (ST) + 1
 -  U, P  parciální arctg při  ST > 0
 FPTAN  (ST) := Y
  ST  := ST - 1
 (ST) := X
 (viz poznámka 5)
 -  I, P  parciální tg (ST)
 0 < (ST) < π/4
 FYL2X  (ST(1)) := (ST(1))  * log2(ST)
  ST  := ST - 1
 -  P  Y * log2X při ST > 0
G E N E R O V Á N Í   K O N S T A N T
 FLDZ   ST := ST - 1
 (ST) := 0
 -  I  zavedení nuly
 FLD1   ST := ST - 1
 (ST) := 1
 -  I  zavedení jedničky
 FLDPI   ST := ST - 1
 (ST) := π
 -  I  zavedení π
 FLDLZE   ST := ST - 1
 (ST) := log2 e
 -  I  zavedení log2 e
 FLDL2T   ST := ST - 1
 (ST) := log2 10
 -  I  zavedení log2 10
 FLDLG2   ST := ST - 1
 (ST) := log10 2
 -  I  zavedení log10 2
 FLDLN2   ST := ST - 1
 (ST) := ln 2
 -  I  zavedení ln 2
Ř Í Z E N Í
 FINIT/FNINIT  CW := 03FFh
 TW := 0
 ST := 0
 -  nulování  inicializace
 FDISI/FNDISI  IEM := 1  -    zákaz přerušení
 FENI/FNENI  IEM := 0  -    povolení přerušení
 FCLEX/FNCLEX   B, IR, P, U, O, Z, D,  I := 0  -    nulování indikátorů chyb
 FINCSTP  ST := ST + 1  -    inkrement ST
 FDECSTP  ST := ST - 1  -    dekrement ST
 FSTSW  D
 FNSTSW  D
 D := stavový registr  D: 2 byty paměti, registr AX (u 80387 a vyšších)    uložení stavu
 FSTCW  D
 FNSTCW  D
 D := (CWR)  D: 2 byty paměti    uložení CW
 FLDCW  S  CWR := (S)  S: 2 byty paměti    zavedení CW
 FSTENV  D
 FNSTENV  D
 (D) := (CWR)
 (D + 2) := (stavový  registr)
 (D + 4) := (značky)
 (D + 6) := (ukazatel  instrukcí)
 (D + 10) := (ukazatel  operandů)
 D: 14 bytů paměti    uložení do paměti
 FLDENV  S  CWR := (S)
 stav. reg. := (S + 2)
 značky := (S + 4)
 ukaz. instrukcí := (S  + 6)
 ukaz. operandů := (S  + 10)
 S: 14 bytů paměti    zavedení do paměti
 FSAVE  D
 FNSAVE  D
 totéž co FSTENV +  zásobník do (D),
 inicializace koprocesoru
 D: 94 bytů paměti    uložení do paměti
 FRSTOR  S  totéž co FLDNEV +  zásobník  z (S)  S: 94 bytů paměti    zavedení z paměti
 FFREE  D  Nastavení značky pro  ST(i)  na "prázdný"  D: ST(i)    prázdný registr
 FNOP  (ST) := (ST)  -    prázdná operace
 FWAIT  jiný tvar instrukce  WAIT  -    uveď CPU do čekání na  numerickou  výjimku
I N S T R U K C E   K O P R O C E S O R U   80387   A   V Y Š Š Í C H
 FUCOM  S/  FUCOMP  S/  FUCOMPP  stejné jeko u FCOM/  FCOMP/  FCOMPP  S: ST(i), není-li S  uvedeno, pak  S = ST(1)  I, D  komparace real (+ pop)  (+ dvakrát  pop)
 znaménko nuly se ignoruje (-0,0 = +0,0)
 FCOS  (ST) := cos[(ST)]  -  I, D, P  cosinus pro (ST) v radiánech  v intervalu  |ST| < 2 63
 FPREM1  (ST) := (ST) mod  (ST (1))  -  I, D, U  to samé co FPREM, ale  instrukce  pracuje podle  normy IEEE Std 754
 FSIN  (ST) := sin [(ST)]  -  I, D, U, P  sinus pro (ST) v radiánech  v intervalu  |ST| < 2 63
 FSINCOS  pomocná := cos[(ST)]
 (ST) := sin[(ST)]
  ST := ST - 1
 (ST):=pomocná
 -  I, D, U, P  sinus a cosinus pro (ST)  v radiánech  v intervalu  |ST| < 2 63
I N S T R U K C E   F P U   P 6   P R O C E S O R Ů   A   V Y Š Š Í C H
 FCOMI S/  FCOMIP S
 FUCOMI S/  FUCOMIP S
 (ST) - (S);
 nastav EFLAGS podle výsledku
 S: ST(i)  I, D  komparace real (+ pop) a zavedení výsledku do registru příznaků EFLAGS
 znaménko nuly se ignoruje (-0,0 = +0,0)
 FCMOVcond  S  if podmínka_je_splněna then  (ST) := (S)  S: ST(i)  -  naplnění ST obsahem ST(i) v závislosti  na EFLAGS nebo příznacíh FPU
 FCMOVB  S/  FCMOVNB  S  přenos, je-li (není-li) menší
 FCMOVE  S/  FCMOVNE  S  přenos, je-li (není-li) rovno
 FCMOVBE  S/  FCMOVNBE  S  přenos, je-li (není-li) menší nebo rovno
 FCMOVU  S/  FCMOVNU  S  přenos, je-li (není-li) "unordered"(?) -  nastavuje se v závislosti na příznacích  FPU
 

 Poznámky:

  1. Není-li specifikován operand D, předpokládá se ST a S musí být operand msr nebo mlr. Jsou-li specifikovány oba operandy, jsou to ST, ST(i) nebo ST(i), ST.
    Není-li specifikován žádný operand, implicitně jsou ST(1), ST a po aritmetické operaci nastane posuv v zásobníku inkrementací (pop) a výsledek je uložen na nový vrchol zásobníku.

  2. Neporovnatelné: C3, C2, C0 = 111
    (ST) > S: C3, C2, C0 = 000
    (ST) < S: C3, C2, C0 = 001
    (ST) = S: C3, C2, C0 = 100

  3. Neporovnatelné: C3, C2, C0 = 111
    (ST) > 0: C3, C2, C0 = 000
    (ST) < 0: C3, C2, C0 = 001
    (ST) = 0: C3, C2, C0 = 100

  4.  
    (ST) C3 C2 C1 C0
    + Unnormal 0 0 0 0
    + NaN 0 0 0 1
    - Unnormal 0 0 1 0
    - NaN 0 0 1 1
    + Normal 0 1 0 0
    + Nekonečno   0 1 0 1
    - Normal 0 1 1 0
    - Nekonečno 0 1 1 1
    + 0 1 0 0 0
      Prázdný 1 0 0 1
    - 0 1 0 1 0
      Prázdný 1 0 1 1
    + Denormal 1 1 0 0
      Prázdný 1 1 0 1
    - Denormal 1 1 1 0
      Prázdný 1 1 1 1

    Kde číslo typu Normal je normalizované a vyhovuje formátu. Číslo typu Denormal vzniká podtečením, kdy exponent vychází menší (algebraicky), než připouští formát. Číslo typu Unnormal může vzniknout z Denormal a má exponent v žádoucím rozsahu, ale mantisu menší než 1. Při použití čísla Unnormal v další operaci ještě může vzniknout správný výsledek typu Normal. Výsledek typu NaN (Not a Number) má speciální význam a existuje jen ve formátech real. Má v exponentu jen jedničky, má znaménko a libovolnou mantisu s výjimkou hodnoty 1,00 ... 0B, která je vyhrazena pro Nekonečno. Použití NaN je popsáno v uživatelském manuálu k iAPX86, 88 vydaném společností INTEL v roce 1977.